package com.tangruojie.domain;

import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
/**
 * tbl 是 “table”（表）的缩写，用于标识该对象是一个数据库表。
 * 推荐的方式是：按模块划分表前缀
 * 表名	            含义
 * sys_user	        系统用户表
 * auth_role	    权限角色表
 * biz_order	    业务订单表
 * cms_article	    内容文章表
 * 这种方式比 tbl_ 更具体、可读性更强。
 */
//@TableName(value = "tbl_user")
public class User {

    /**
     * 适用场景（什么时候用 NONE）
     * 场景	                                是否适合使用 NONE
     * 数据库中主键是自增	                    ❌ 不合适，应该用 AUTO
     * 主键是由你手动赋值（如业务ID）	        ❌ 用 INPUT 更明确
     * 主键由第三方系统生成（如第三方订单号）	    ✅ 可选用 NONE，你来赋值
     * 不使用主键（很少）	                    ✅ 可用 NONE（MP不会处理主键）
     */

//    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    @TableField(value = "pwd", select = false)
    private String password;
    private Integer age;
    private String tel;
    @TableField(exist = false)
    private Integer online;
    /**
     * 逻辑删除：将delete操作转化为update操作
     */
    @TableLogic
    private Integer deleted;

    /**
     * 数据库字段类型与 Java 映射总结
     * MySQL 类型	    Java 类型（JDK 1.8+）	    Java 类型（旧版）
     * DATE	            LocalDate	                java.sql.Date
     * DATETIME	        LocalDateTime	            java.sql.Timestamp
     * TIMESTAMP	    LocalDateTime / Instant	    java.sql.Timestamp
     * TIME	            LocalTime	                java.sql.Time
     */

    /**
     * 删除时间
     * 增加删除时间字段，一定存在逻辑删除字段，执行的SQL语句为update操作，该字段作用观察updateTime即可
     * 无实际意义，updateTime字段可代替删除时间字段
     */
//    @TableField(fill = FieldFill.UPDATE)
//    private LocalDateTime deleteTime;
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * 乐观锁
     */
    @Version
    private Integer version;

}
/**
 * 数据库字段命名推荐采用：全小写 + 下划线分隔 + 语义明确 + 非保留字 + 英文命名，既能保证跨平台兼容，也能与 Java 后端无缝衔接。
 * 实际命名示例表（User 表）
 * 字段名	        含义
 * id	            主键
 * user_name	    用户名
 * email	        邮箱
 * password	        密码
 * phone_number	    手机号
 * create_time	    创建时间
 * update_time	    更新时间
 * is_deleted	    是否已删除（0-否，1-是）
 * ----------
 * 字段命名语义规范（字段的含义要明确）
 * 字段类型	    推荐命名	                    示例
 * 主键字段	    id / 表名_id	                user_id, order_id
 * 外键字段	    关联表名_id	                role_id, dept_id
 * 状态字段	    _status, is_开头	            is_active, delete_status
 * 时间字段	    _time, _at, _date	        create_time, update_at, birth_date
 * 金额字段	    _amount, _price, _cost	    total_amount, unit_price
 * 标志位	    is_开头	                    is_deleted, is_valid（0或1）
 * 计数字段	    _count, _num	            view_count, order_num
 * 说明文字	    _desc, _remark	            product_desc, note_remark
 * ----------
 * MyBatis-Plus 默认字段映射关系（自动映射规则）
 * MyBatis-Plus 默认会根据以下规则将实体类字段映射到数据库字段：
 * 实体类字段（Java）	表字段（SQL）
 * userName	        user_name
 * createTime	    create_time
 * isDeleted	    is_deleted
 * age	            age
 * ✅ 规则说明：
 * Java 使用的是 驼峰命名（camelCase）；
 * 数据库使用的是 下划线命名（snake_case）；
 * MyBatis-Plus 默认开启了驼峰转下划线映射机制，会自动将 userName → user_name。
 */
